前一篇談了一些 Java
的元件介紹,這篇會針對 mouse
的事件多加說明自己踩過的坑。
在 View Pager 父母管得多 這篇文章就有提到了,那時遇到的問題是對螢幕的 event 到底是觸發在子?還是父母?這問題不會影響程式的正確性,但是對使用者體驗來講是個很大的差異!
而這幾天在寫 Java
的元件時,也同樣遇到了這樣的問題,那麼下面就來看看到底如何解決的吧!
我在一個 Scrollpane
裡面加入了一層 JPanel
,這層 JPanel
裡面又有 JTable
,當我的滑鼠滾動 (mouseWheel
) 滾在這個 JTable
上面的時候,背景的 ScrollPane
不會滾動,但是碰在 JPanel
上面,又會正常執行,啊~~~好惱人啊!!
首先,先拆解一張 JTable
的組成
上面的灰色的部分是 Header
,下面是 data
。宣告一個 JTable
出來之後,只會看到下面白色的 data
的部分,把這個 JTable
放入 ScrollPane
裡面,才會看到上面灰色的 title 部分。
接著,因為 JTable
並沒有滑鼠滑動的 event,所以我需要去新增一個 MouseWheelListener
,並且因為我想要的是後面的 ScrollPane
做滾動,所以我把這個滾動的訊息跟 ScrollPane
講,講說 “我現在碰在 JTable
身上,後面的 ScrollPane
要滾動了!”,程式碼如下
table.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
CalculatorFrame.scroller.dispatchEvent(e);
}
});
這一解法嘗試了好多次才找到 ...
這樣,就完成了 80% 了,當滑鼠在白色的 data
部分做滾動的時候,整個 ScrollPane
也會跟著滾動,但是放在灰色的 Header
部分時,仍然沒有反應,所以我就繼續的試 ... 才發現灰色部分的 event 是作用在包裝子 JTable
的 ScrollPane
,但是 ScrollPane
本身是有 MouseWheelListener
,所以我需要先把他給移除掉,再新增一個傳到背景 ScrollPane
的 listner,程式碼如下:
scrollPane.removeMouseWheelListener(scrollPane.getMouseWheelListeners()[0]);
scrollPane.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
CalculatorFrame.scroller.dispatchEvent(e);
}
});